Tests for use charnames with compilation errors and aliases.
__END__
# NAME illegal :pragma
use warnings;
use charnames ":scoobydoo";
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
unsupported special ':scoobydoo' in charnames at
########
# NAME autoload doesn't get vianame
print "Here: \N{DIGIT ONE}\n";
charnames::vianame("DIGIT TWO");
EXPECT
OPTIONS regex
Undefined subroutine &charnames::vianame called at - line \d+.
Here: 1
########
# NAME autoload doesn't get viacode
print "Here: \N{DIGIT THREE}\n";
charnames::viacode(0x34);
EXPECT
OPTIONS regex
Undefined subroutine &charnames::viacode called at - line \d+.
Here: 3
########
# NAME autoload doesn't get string_vianame
print "Here: \N{DIGIT FOUR}\n";
charnames::string_vianame("DIGIT FIVE");
EXPECT
OPTIONS regex
Undefined subroutine &charnames::string_vianame called at - line \d+.
Here: 4
########
# NAME wrong type of alias (missing colon)
no warnings;
use charnames "alias";
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias without an argument
use warnings;
use charnames ":alias";
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
:alias needs an argument in charnames at
########
# NAME reversed sequence
use warnings;
use charnames ":alias" => ":full";
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
:alias cannot use existing pragma :full \(reversed order\?\) at
########
# NAME alias with hashref but with :short
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with hashref to :full OK
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME alias with hashref to :loose OK
use warnings;
no warnings 'void';
use charnames ":loose", ":alias" => { e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME alias with :loose requires :full type name
use warnings;
no warnings 'void';
use charnames ":loose", ":alias" => { e_ACUTE => "latin SMALL LETTER E WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with hashref to :short but using :full
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with hashref to :short OK
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE" };
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME alias with bad hashref
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => "e_ACUTE";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
unicore/e_ACUTE_alias.pl cannot be used as alias file for charnames at
########
# NAME alias with arrayref
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => [ e_ACUTE => "LATIN:e WITH ACUTE" ];
"Here: \N{e_ACUTE}!\n";
EXPECT
OPTIONS regex
Only HASH reference supported as argument to :alias at
########
# NAME alias with bad hashref
no warnings;
use charnames ":short", ":alias" => { e_ACUTE => "LATIN:e WITH ACUTE", "a_ACUTE" };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
Unknown charname 'a_ACUTE' at
########
# NAME alias with hashref two aliases
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => {
    e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "",
    };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'a_ACUTE' at - line \d+, within string
########
# NAME alias with hashref two aliases
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => {
    e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN:a WITH ACUTE",
    };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME alias with hashref using mixed aliases
use warnings;
use charnames ":short", ":alias" => {
    e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN SMALL LETTER A WITH ACUT",
    };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'a_ACUTE' at - line \d+, within string
########
# NAME alias with hashref using mixed aliases
use warnings;
use charnames ":short", ":alias" => {
    e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
    };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'a_ACUTE' at - line \d+, within string
########
# NAME alias with hashref using mixed aliases
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => {
    e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
    };
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with nonexisting file
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "non_existing_xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
unicore/non_existing_xyzzy_alias.pl cannot be used as alias file for charnames at
########
# NAME alias with bad file name
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "xy 7-";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
Charnames alias file names can only have identifier characters at
########
# NAME alias with non_absolute (existing) file name (which it should /not/ use)
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "perl";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
unicore/perl_alias.pl cannot be used as alias file for charnames at
########
# NAME alias with bad file
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
0;
--FILE--
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
unicore/xyzzy_alias.pl did not return a \(valid\) list of alias pairs at
########
# NAME alias with file with empty list
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
();
--FILE--
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with file OK but file has :short aliases
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
(   e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN:a WITH ACUTE",
    );
--FILE--
use warnings;
no warnings 'void';
use charnames ":full", ":alias" => "xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with :short and file OK
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
(   e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN:a WITH ACUTE",
    );
--FILE--
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => "xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME alias with :short and file OK has :long aliases
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
(   e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
    a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
    );
--FILE--
use warnings;
no warnings 'void';
use charnames ":short", ":alias" => "xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with file implicit :full but file has :short aliases
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
(   e_ACUTE => "LATIN:e WITH ACUTE",
    a_ACUTE => "LATIN:a WITH ACUTE",
    );
--FILE--
use warnings;
no warnings 'void';
use charnames ":alias" => ":xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex fatal
Unknown charname 'e_ACUTE' at - line \d+, within string
########
# NAME alias with file implicit :full and file has :long aliases
--FILE-- ../../lib/unicore/xyzzy_alias.pl
#!perl
(   e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
    a_ACUTE => "LATIN SMALL LETTER A WITH ACUTE",
    );
--FILE--
use warnings;
no warnings 'void';
use charnames ":alias" => ":xyzzy";
"Here: \N{e_ACUTE}\N{a_ACUTE}!\n";
EXPECT
OPTIONS regex
$
########
# NAME charnames with no import still works for runtime functions
use warnings;
no warnings 'void';
use charnames ();
charnames::vianame('SPACE');
charnames::viacode(0x41);
EXPECT
OPTIONS regex
$
########
# NAME no extraneous warning [perl #11560]
use warnings;
use charnames ();
print charnames::viacode(0x80), "\n";
EXPECT
OPTIONS regex
PADDING CHARACTER
########
# NAME various wrong characters in :alias are errors
# Below, one of the EXPECT regexes matches both the UTF-8 and non-UTF-8 form.
# This is because under some circumstances the message gets output as UTF-8.
use charnames ":full", ":alias" => {
                            "4e_ACUTE" => "LATIN SMALL LETTER E WITH ACUTE",
                            "e_A,CUTE" => "LATIN SMALL LETTER E WITH ACUTE",
                            "e_ACUT\x{d7}E" => "LATIN SMALL LETTER E WITH ACUTE",
                    };
EXPECT
OPTIONS regex
Invalid character in charnames alias definition; marked by <-- HERE in '4<-- HERE e_ACUTE'
Invalid character in charnames alias definition; marked by <-- HERE in 'e_A,<-- HERE CUTE'
Invalid character in charnames alias definition; marked by <-- HERE in 'e_ACUT(?:\x{d7}|\x{C3}\x{97})<-- HERE E'
########
# RT#73022
# NAME \N{...} interprets ... as octets rather than UTF-8
use utf8;
use open qw( :utf8 :std );
use charnames ":full", ":alias" => { "自転車に乗る人" => "BICYCLIST" };
print "ok\n" if "\N{自転車に乗る人}" eq "\x{1F6B4}";
EXPECT
ok
########
# NAME Misspelled \N{} UTF-8 names are errors
use utf8;
use open qw( :utf8 :std );
use charnames ":full", ":alias" => { "自転車に乗る人" => "BICYCLIST" };
print "ok\n" if "\N{転車に乗る人}" eq "\x{1F6B4}";
EXPECT
OPTIONS regex
Unknown charname '転車に乗る人' at - line \d+, within string
########
# NAME various wrong UTF-8 characters in :alias are errors
# First has a punctuation, KATAKANA MIDDLE DOT, in it; second begins with a
# digit: ARABIC-INDIC DIGIT FOUR
use utf8;
use open qw( :utf8 :std );
use charnames ":full", ":alias" => { "自転車・に乗る人" => "BICYCLIST",
                                     "٤転車に乗る人" => "BICYCLIST",
                                    };
print "ok\n" if "\N{自転車・に乗る人}" eq "\x{1F6B4}";
print "ok\n" if "\N{٤転車に乗る人}" eq "\x{1F6B4}";
EXPECT
OPTIONS regex
Invalid character in charnames alias definition; marked by <-- HERE in '٤<-- HERE 転車に乗る人'
Invalid character in charnames alias definition; marked by <-- HERE in '自転車・<-- HERE に乗る人' at - line \d+
########
# NAME trailing and sequences of multiple spaces in :alias names are deprectated
use charnames ":alias" => { "TOO  MANY SPACES" => "NO ENTRY SIGN",
                            "TRAILING SPACE " => "FACE WITH NO GOOD GESTURE"
                          };
print "ok\n" if "\N{TOO  MANY SPACES}" eq "\x{1F6AB}";
print "ok\n" if "\N{TRAILING SPACE }" eq "\x{1F645}";
no warnings 'deprecated';
print "ok\n" if "\N{TOO  MANY SPACES}" eq "\x{1F6AB}";
print "ok\n" if "\N{TRAILING SPACE }" eq "\x{1F645}";
EXPECT
OPTIONS regex
A sequence of multiple spaces in a charnames alias definition is deprecated; marked by <-- HERE in 'TOO   <-- HERE MANY SPACES' at - line \d+.
Trailing white-space in a charnames alias definition is deprecated; marked by <-- HERE in 'TRAILING SPACE  <-- HERE ' at - line \d+.
ok
ok
ok
ok
